package chapter01;

public class Rotate48 {
    /**
     * 观察方阵 最外围的值旋转后只在只在最外围
     * 框架左上角(0，0) 右下角(length-1,length-1)
     * 每次只需要将框架缩小 左上角(x++，y++) 右下角(x--,y--)
     * 根据规律进行转换
     *   a e----------b    a->b->c->d->a
     *  |             f    e->f->g->h->e
     *  |             |
     *  h             |
     *  d---------- g c
     *  找到规律：若此时方阵若为n*n 左上角坐标(startX,startY) 右下角坐标(endX,endY)
     *  for i=0 to endX-startX
     *      [startX,StartY+i]=[endX-i,startY]
     *      [endX-i,startY]=[endX,endY-i]
     *      [endX,endY-i]=[startX+i,endY]
     *      [startX+i,endY]=[startX,startY+i]
     */
    public void rotate(int[][] matrix) {
        int start=0;
        int end= matrix.length-1;
        while (start<end){
            swap(matrix,start,end);
            start++;
            end--;
        }
    }

    public void swap(int[][] matrix,int start,int end){
        int startX=start;
        int startY=start;
        int endX=end;
        int endY=end;
        for(int i=0;i<end-start;i++){
            int item= matrix[startX][startY+i];
            matrix[startX][startY+i]=matrix[endX-i][startY];
            matrix[endX-i][startY]=matrix[endX][endY-i];
            matrix[endX][endY-i]=matrix[startX+i][endY];
            matrix[startX+i][endY]=item;
        }
    }
}
